# -*- coding: utf-8 -*-

'''
exemplos da aula
'''

'''
funcoes2.py
'''
def frec(l1,x,n):
    '''
frec - devolve uma lista com n elementos x
x- o elemento a repetir
n - numero de repetiçoes
'''
    if not n:
        return l1
    else:
        return [x] + frec(l1,x, n-1)

l2=frec([], ' Bu ', 5)
print l2

print " "


'''
funcoescauda.py
'''
def fatorial(n):
    if n<=0:
        return 1
    else:
        return n*fatorial(n-1)

def fatorial_cauda(n):
    def fact(i=n,acc=1):
        if i==0:
            return acc
        else:
            return fact(i-1,(acc*i))
    return fact()

print fatorial(5)    
print fatorial_cauda(5)

print ""
    
'''
iteradores
'''
lista = ['a', 'b','c']
it = iter(lista)
print it
x1 = it.next()
print x1
x2=it.next()
print x2


print ""

print "cenas"	

'''
listgen.py
'''

lista_linhas=['    uma','  duas','      tres']

#expressao de geracao -- devolve iterador
it = (linha.strip() for linha in lista_linhas)
print it.next() + it.next() + it.next()

total_letras = sum(len(linha.strip())
for linha in lista_linhas)
print "total letras {0}".format(total_letras)

#compreensao de lista -- devolve uma lista
lista = [linha.strip()
for linha in lista_linhas
if len(linha)>7]

print lista

print ""

'''
gen1.py
'''

def gerar_cubos(N):
	for i in range(N):
		yield i**3
		
gen = gerar_cubos(5)

print gen.next()
print gen.next()
print gen.next()
print gen.next()
print gen.next()

print
for y in gerar_cubos(5):
	print y		


print ""
'''
fun1.py
'''

import math
def gerar_cubos(N):
	for i in range(N):
		yield i**3
		
def gerar_quad(N):
	for i in range(N):
		yield i**2

def raiz(x,y):
	return math.sqrt(x+y)
	
lista = map(raiz, gerar_cubos(5), gerar_quad(5))
i=0
while i<5:
	print i,"->", math.sqrt(i**3+i**2),"==",lista[i]
	i+=1					


print ""
'''
fun2.py
'''

def gerar_cubos(N):
	for i in range(N):
		yield i**3

def predicado(s):
	return len(s) %2

def f(x,y):
	return x+math.sqrt(y)
	
lista =filter(predicado, ['batata', 'couve','cebola','repolho'])
print lista

print reduce(f, gerar_cubos(5))	


print ""
'''
fun3.py
'''

def f(x):
	if len(x)%2-1:
		return x.lower()
	else:
			return x.upper()
			
expressao = lambda x:x.lower() if len(x)%2-1 else x.upper()

lista = ['Lisboa','Caracas','Madrid','Londres','Berlin','Paris']

lista_out1=map(expressao,lista)
lista_out2=map(f,lista)

print lista_out1
print lista_out2			
	
print ""	
'''
conj1.py
'''

lista1= [1,2,3,4,5,4,5,5,1,3]
lista2=[x for x in set(lista1)]
print lista2

s1= {'A','B','C','D','E'}
s2= {'A','B'}
print s1 & s2, s1 ^s2, s1 | s2
print s1<s2, s1-s2

print s1.union(s2), s1.intersection(s2)

'''
dict1.py
'''

d1 = {'Programacao 1' :15,
	  'Programacao 2':13,
	  'Matemática': 12,
	  'Linguagens de Programacao':17}

d1['Algebra']=13

media=0.0
c=0
for valor in d1.itervalues():
	media +=valor
	c +=1
media /= c

print "media = ", media
for chave, valor in d1.iteritems():
	print chave, valor		  
	

print ""
'''
module1.py
'''
import sys
from random import *
from math import atan2, atan, sqrt
import math

print sys.path

lista = [uniform(0,100) for k in xrange(10)]
lista2=map(lambda x,y: (round(x),round(atan2(x,y)*180.0/math.pi)),
map(sqrt, lista),
map(lambda x: x**0.5, lista))
for raiz, grau in lista2:
	print " raiz =", raiz, "graus = ", grau
	
	
	


'''
exercicios laboratorio
'''

		


